package org.example.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.util.Date;

//aspectj的advice通知增强类，无需实现任何接口
@Component("Aspect3")
@Aspect
public class Aspect3 {
    //应用场景：日志、缓存、权限、性能监控、事务管理
    //环绕通知：在目标对象方法的执行前+后，可以增强
    //参数：可以执行的连接点对象ProcessdingJoinPoint（方法），特点是调用proceed()方法可以随时随地执行目标对象的方法（相当于目标对象的方法执行了）
    //必须抛出一个Throwable

    //环绕通知：
//	@Around("execution(* org.example*.*(..))")//要增强返回类型任意，所有的org.example包中的类，类中所有的方法，参数任意
//	@Around("execution(* org.example..*.*(..))")//要增强返回类型任意，org.example包，及其子包中所有类，类中所有的方法，参数任意
//	@Around("execution(* org.example..*.save(..))")//要增强org.example包及其子包中所有的类，类中以save结尾的方法，参数任意
    //要增强org.example包中的ICustomerService类的子类型的所有方法，参数任意
    @Around("execution(* org.example.servcie.ICustomerServcie+.*(..))")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
        //目标：事务的控制：
        //开启事务：
//        System.out.println("-----开启了事务。。。。。。。。。");
        Date d1 = new Date();
        //执行了目标对象的方法
        Object resultObject = proceedingJoinPoint.proceed();
        //结束事务
//        System.out.println("-----提交了事务。。。。。。。。。");
        Date d2 = new Date();
        System.out.println("执行时间:"+(d2.getTime()-d1.getTime())+"ms");
        return resultObject;//目标对象执行的结果
    }
}